package aiservice

import (
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// SSEStreamManager 统一管理响应给前端的消息的结构体
type SSEStreamManager struct {
	// ctx   *gin.Context // 使用gin.Context
	index int // 用于存储客户端ID，改为整型
}

// NewSSEStreamManager 创建一个新的SSE流管理器，直接传入上下文
func NewSSEStreamManager() *SSEStreamManager {
	return &SSEStreamManager{
		// ctx:   ctx,
		index: 0, // 初始化id
	}
}

// SendTongyi 向连接的客户端发送消息
func (manager *SSEStreamManager) SendTongyi(ctx *gin.Context, data any) {
	if ctx != nil {
		manager.index++ // 每次发送时递增id
		manager.sendToClient(ctx, "result", "200", data)
	}
}

// SendMessage 向连接的客户端发送消息
func (manager *SSEStreamManager) SendMessage(ctx *gin.Context, event string, data any) {

	if ctx != nil {
		manager.index++ // 每次发送时递增id
		manager.sendToClient(ctx, event, "200", data)
	}
}

// sendToClient 向单个客户端发送消息
func (manager *SSEStreamManager) sendToClient(ctx *gin.Context, event string, status string, data any) {
	// 设置响应头为文本/事件流类型
	// 确保响应头设置正确
	ctx.Writer.Header().Set("Content-Type", "text/event-stream")
	ctx.Writer.Header().Set("Cache-Control", "no-cache")
	ctx.Writer.Header().Set("Connection", "keep-alive")
	ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
	// 将Data字段转换为JSON字符串
	dataStr, err := json.Marshal(data)
	if err != nil {
		http.Error(ctx.Writer, "Failed to marshal JSON", http.StatusInternalServerError)
		return
	}

	// 构造SSE消息
	sseMsg := fmt.Sprintf("id: %d\n"+
		"event: %s\n"+
		":HTTP_STATUS/%s\n"+
		"data: %s\n\n",
		manager.index, event, status, dataStr)

	// 发送消息到客户端
	ctx.Writer.Write([]byte(sseMsg))

	// 确保数据被刷新
	ctx.Writer.Flush()
}
